perm filename SEC.SAI[4,KMC]1 blob sn#177273 filedate 1975-09-17 generic text, type T, neo UTF8
COMMENT COMPARE compares 2 files and lists their differences or merges them;

BEGIN

REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;

STRING PROC READ1;
	BEGIN
	STRING LINE;
	DO LINE ← IN_LINE UNTIL LINE OR EOF;
	RETURN(LINE);
	END;

STRING PROC READ2;
	BEGIN
	STRING LINE;
	DO LINE ← INPUT(INCH2, 1) UNTIL LINE OR EOF;
	RETURN(LINE);
	END;

PROC COMPARE(VALUE STRING MODE);
	BEGIN
	BOOLEAN DIF;
	STRING WORD1, WORD2;
	BREAK_BLANK;
	DIF ← EQU(MODE, "DIF");
	FILIN((FILE ← GET_A_STRING("1st file to compare")), INCH1);
	FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
	FILIN((FILE ← GET_A_STRING("2nd file to compare")), INCH2);
	IF DIF THEN FILOUT(SCAN(FILE, 7, BRK) & ".DIF", OUCH2);

	WORD1 ← READ1;
	WORD2 ← READ2;
	DO	BEGIN
		IF EQU(WORD1, WORD2) THEN
			BEGIN
			IF ¬DIF THEN OUT_LINE(WORD1);
			WORD1 ← READ1;
			WORD2 ← READ2;
			END
		ELSE IF ALPHA(WORD1, WORD2) > 0 THEN
			BEGIN
			OUT_LINE(WORD1);
			WORD1 ← READ1;
			END
		ELSE	BEGIN
			IF DIF THEN OUT(OUCH2, WORD2 ↓)
			ELSE OUT_LINE(WORD2);
			WORD2 ← READ2;
			END;
		END
	UNTIL EOF;
	IF WORD1 THEN DO
		BEGIN
		OUT_LINE(WORD1);
		WORD1 ← READ1;
		END
		UNTIL EOF
	ELSE DO BEGIN
		IF DIF THEN OUT(OUCH2, WORD2 ↓)
		ELSE OUT_LINE(WORD2);
		WORD2 ← READ2;
		END
		UNTIL EOF;

	RELEASE(INCH1);
	RELEASE(OUCH1);
	RELEASE(INCH2);
	IF DIF THEN RELEASE(OUCH2);
	END;

α PAIRWISE compares lines of a file to find duplicates or insert blanks;

PROC PAIRWISE(VALUE STRING MODE);
	BEGIN
	BOOLEAN DUP;
	STRING THIS, NEXT;
	STRING THIS_KEY, NEXT_KEY;
	BREAK_TAB;
	DUP ← EQU(MODE, "DUP");
	FILIN((FILE ← GET_A_STRING("File to examine")), INCH1);
	FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
	THIS ← IN_LINE;
	THIS_KEY ← CAR(THIS);
	IF ¬DUP THEN OUT_LINE(THIS);
	NEXT ← IN_LINE;
	WHILE ¬EOF DO
	IF NEXT THEN
		BEGIN
		NEXT_KEY ← CAR(NEXT);
		IF DUP THEN
			BEGIN
			IF EQU(THIS_KEY, NEXT_KEY) THEN
				OUT_LINE(THIS ∂ NEXT);
			END
		ELSE	BEGIN
			IF ¬EQU(THIS_KEY, NEXT_KEY) THEN OUT_LINE(NULL);
			OUT_LINE(NEXT);
			END;
		THIS ← NEXT;
		THIS_KEY ← NEXT_KEY;
		NEXT ← IN_LINE;
		END
	ELSE NEXT ← IN_LINE;
	RELEASE(INCH1);
	RELEASE(OUCH1);
	END;

α SCREEN switches the members of a pair or finds chosen lines;

PROC SCREEN(VALUE STRING MODE);
	BEGIN
	BOOLEAN INV;
	STRING LINE;
	BREAK_TAB;
	INV ← EQU(MODE, "INV");
	FILIN((FILE ← GET_A_STRING("File to screen")), INCH1);
	FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
	EAT_DIR(LINE, INCH1);
	LINE ← IN_LINE;
	WHILE ¬EOF DO
	IF LINE THEN
		BEGIN
		STRING FIRST, REST;
		FIRST ← CAR(LINE);
		REST ← CDR(LINE);
		IF INV THEN OUT_LINE(REST & TAB & TAB & FIRST)
		ELSE	BEGIN
			IF ¬EQU(FIRST, REST) THEN OUT_LINE(LINE);
			END;
		LINE ← IN_LINE;
		END
	ELSE LINE ← IN_LINE;
	RELEASE(INCH1);
	RELEASE(OUCH1);
	END;

α ONE_SHOT does whatever special job I need done;

PROC ONE_SHOT;
	BEGIN
	STRING LINE;
	BREAK_BLANK;
	FILIN("DIC[PAR,RCP]", INCH1);
	FILOUT("VERBS[PAR,RCP]", OUCH1);
	EAT_DIR(LINE, INCH1);
	WHILE (LINE ← IN_LINE) DO
		OUT_LINE((SCAN(LINE, 2, BRK))[2 TO ∞]);
	RELEASE(INCH1);
	RELEASE(OUCH1);
	END;

α This selects the requested routine;

WHILE TRUE DO
	BEGIN
	STRING JOB;
	BREAK_LINE;
	BREAK_EXT;
	JOB ← GET_A_STRING(
"Compare, Merge, Dups, sPread, Switch, Redundant, One_shot, eXit");
	     IF JOB = "C" THEN COMPARE("DIF")
	ELSE IF JOB = "M" THEN COMPARE("MRG")
	ELSE IF JOB = "D" THEN PAIRWISE("DUP")
	ELSE IF JOB = "P" THEN PAIRWISE("SPR")
	ELSE IF JOB = "S" THEN SCREEN("INV")
	ELSE IF JOB = "R" THEN SCREEN("RED")
	ELSE IF JOB = "O" THEN ONE_SHOT
	ELSE IF JOB = "X" THEN DONE
	ELSE OUTSTR("You blew it" ↓);
	END;

END